package com.adee.jvm;

import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.vm.VM;

/**
 * java对象内存布局
 * java对象由构成：对象头 + 实例数据 + 填充
 * 对象头：
 *    标记字（Mark Word）8字节：
 *    类型指针（Klass Pointer）4字节：指向Class对象
 *    数组长度（数组类型对象才有该部分）4字节：
 *
 * 实例数据：即字段，包含父类字段
 */
public class Test003_ObjectLayout {
    public static void main(String[] args) {
        // 当前jvm信息
        System.out.println(VM.current().details());
        User u = new User();
        // 查看对象内存布局
        System.out.println(ClassLayout.parseInstance(u).toPrintable());
        // 查看由父类的对象内存布局
        B b = new B();
        System.out.println(ClassLayout.parseInstance(b).toPrintable());
    }

    static class User {
        int id,age,weight;
        byte sex;
        long phone;
        char local;
    }

    static class A {
        int i1,i2;
        long l1,l2;
        char c1,c2;
        private int i3, i4; // private成员变量也会到子类对象内存布局中
        static byte s1,s2; // 静态变量不会出现在实例对象的内存布局中
    }
    static class B extends A{
        boolean b1;
        double d1,d2;
    }
}
